package com.liuchuanzheng.lcz_changeconfig.config

import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.view.View
import com.liuchuanzheng.lcz_changeconfig.BuildConfig
import com.liuchuanzheng.lcz_changeconfig.ChangeConfigActivity
import java.util.function.Consumer

/**
 * @author 刘传政
 * @date 3/4/21 1:38 PM
 * QQ:1052374416
 * 电话:18501231486
 * 作用:app环境配置等的管理类.在这里能获取当前环境/所有环境列表/修改想使用的环境
 * 注意事项:
 */
object ConfigManager {
    //代表打包时选的auto风味,也就表示了app可以随意替换环境配置
    const val FLAVOR_AUTO = "auto"
    //代表打包时选的online风味,也就表示了app不能随意替换环境配置
    const val FLAVOR_ONLINE = "online"
    lateinit var context:Context
    lateinit var sp: SharedPreferences
    private var mCurrentConfig:Config? = null
    fun init(context: Context){
        this.context = context
        sp = context.getSharedPreferences("appConfig", Context.MODE_PRIVATE)

        if (getCurrenFlor().equals(ConfigManager.FLAVOR_AUTO)) {

        }else if (getCurrenFlor().equals(ConfigManager.FLAVOR_ONLINE)){
            //此模式下自动选择正式环境.
            changeCurrentConfig(Config.ONLINE.mName)
        }

    }

    private val spKey = "currentConfigType"

    fun getCurrentConfig(): Config {
        if (!this::context.isInitialized) {
            throw  IllegalArgumentException("必须先调用ConfigManager.init方法");
        }
        if (mCurrentConfig === null) {
            val currentConfigType = sp.getString(spKey, "")!!
            if (currentConfigType.isNullOrBlank()) {
                //如果进来后还没选择过任何一个,就使用列表的第一个
                val configs = Config.values()
                val defaultConfig = configs.get(0)
                changeCurrentConfig(defaultConfig.mName)
                mCurrentConfig = defaultConfig
            }
            val currentConfig = map(currentConfigType)
            currentConfig?.let {
                mCurrentConfig = currentConfig
            }
        }
        if (mCurrentConfig == null) {
            throw  IllegalArgumentException("环境配置不对,请检查");
        }
        return mCurrentConfig!!
    }
    fun getCurrenFlor(): String {
        if (!this::context.isInitialized) {
            throw  IllegalArgumentException("必须先调用ConfigManager.init方法");
        }
        return BuildConfig.FLAVOR
    }
    fun changeCurrentConfig(configType: String){
        if (!this::context.isInitialized) {
            throw  IllegalArgumentException("必须先调用ConfigManager.init方法");
        }
        val config = map(configType)
        if (config== null) {
            throw  IllegalArgumentException("只能是预定义好的环境才能切换");
        }else{
            mCurrentConfig = config
            sp.edit().putString(spKey,configType).apply()
        }
    }

    fun map(configType: String):Config?{
        val configs = Config.values()
        configs.forEachIndexed { index, config ->
            if (configType.equals(config.mName)) {
                return config
            }
        }
        //如果都没有找到,可能是之前的某个记录环境又给删了.那我把它置空
        sp.edit().putString(spKey,"").apply()
        return null
    }
    fun getAllConfigs(): Array<Config> {
        return Config.values()
    }


}